package com.sakura.protorype.deepclone;

/**
 * //TODO
 *         浅拷贝的介绍
         * 1) 对于数据类型是基本数据类型的成员变量，浅拷贝会直接进行值传递，也就是将
         * 该属性值复制一份给新的对象。
         * 2) 对于数据类型是引用数据类型的成员变量，比如说成员变量是某个数组、某个类
         * 的对象等，那么浅拷贝会进行引用传递，也就是只是将该成员变量的引用值（内
         * 存地址）复制一份给新的对象。因为实际上两个对象的该成员变量都指向同一个
         * 实例。在这种情况下，在一个对象中修改该成员变量会影响到另一个对象的该成
         * 员变量值
         * 3) 前面我们克隆羊就是浅拷贝
         *  4) 浅拷贝是使用默认的 clone()方法来实现
 *
 *   //TODO   深拷贝基本介绍
             * 1) 复制对象的所有基本数据类型的成员变量值
             * 2) 为所有引用数据类型的成员变量申请存储空间，并复制每个引用数据类型成员变
             * 量所引用的对象，直到该对象可达的所有对象。也就是说，对象进行深拷贝要对
             * 整个对象进行拷贝
             * 3) 深拷贝实现方式1：重写clone方法来实现深拷贝
             * 4) 深拷贝实现方式2：通过对象序列化实现深拷贝(推荐)
 *
 * @Author Sakura
 * @Date 2022/11/23 10:17
 * @Version 1.0
 */
public class Client {
    public static void main(String[] args) throws Exception {
        DeepProtoType p = new DeepProtoType();
        p.name = "宋江";
        p.deepCloneableTarget = new DeepCloneableTarget("大牛", "小牛");

        //方式1 完成深拷贝

//		DeepProtoType p2 = (DeepProtoType) p.clone();
//
//		System.out.println("p.name=" + p.name + "p.deepCloneableTarget=" + p.deepCloneableTarget.hashCode());
//		System.out.println("p2.name=" + p.name + "p2.deepCloneableTarget=" + p2.deepCloneableTarget.hashCode());

        //方式2 完成深拷贝
        DeepProtoType p2 = (DeepProtoType) p.deepClone();

        System.out.println("p.name=" + p.name + "p.deepCloneableTarget=" + p.deepCloneableTarget.hashCode());
        System.out.println("p2.name=" + p.name + "p2.deepCloneableTarget=" + p2.deepCloneableTarget.hashCode());

    }
}
